// var _ = require('lodash');
// var fs = require('fs');
var gulp = require('gulp');
var del = require('del');
var path = require('path');
// var ejs = require('gulp-ejs');
// var gulpif = require('gulp-if');
// var less = require('gulp-less');
// // var util = require('./lib/util');
var uglify = require('gulp-uglify');
// var usemin = require('gulp-usemin');
// var lazyImageCSS = require('gulp-lazyimagecss');  // 自动为图片样式添加 宽/高/background-size 属性
var minifyCSS = require('gulp-cssnano');
// var imagemin = require('gulp-imagemin');
// var pngquant = require('imagemin-pngquant');
// var tmtsprite = require('gulp-tmtsprite');   // 雪碧图合并
// var ejshelper = require('tmt-ejs-helper');
var postcss = require('gulp-postcss'); // CSS 预处理
// var postcssPxtorem = require('postcss-pxtorem'); // 转换 px 为 rem
var postcssAutoprefixer = require('autoprefixer');
// var posthtml = require('gulp-posthtml');
// var posthtmlPx2rem = require('posthtml-px2rem');
// var RevAll = require('gulp-rev-all');   // reversion
// var revDel = require('gulp-rev-delete-original');
// // var changed = require('./common/changed')();
// var webpack = require('webpack-stream');
// var babel = require('gulp-babel');
var rev = require('gulp-rev');
var revReplace = require("gulp-rev-replace");
var revCollector = require('gulp-rev-collector');
// //svg转换用到的组件
// var fs = require('fs');
// var rename = require('gulp-rename');
// var svgmin = require('gulp-svgmin');
// var svgInline = require('gulp-svg-inline');
// var replace = require('gulp-replace');
// var parseSVG = require('./common/parseSVG');
// var svgToPng = require('./common/svgToPng');
// var svgSymbol = require('gulp-svg-sprite');

// var webpackConfigPath = path.join(process.cwd(), 'webpack.config.js');
// var webpackConfig; // webpack 配置
// var jsPath = path.join(process.cwd(), 'src', 'js');

// if (util.dirExist(jsPath) && util.fileExist(webpackConfigPath)) {
//     webpackConfig = require(webpackConfigPath);
// }

var paths = {
    src: {
        dir: './src',
        img: './src/img/**/*.{JPG,jpg,png,gif,svg}',
        slice: './src/slice/**/*.png',
        js: './src/**/*.js',
        media: './src/media/**/*',
        less: './src/css/style-*.less',
        sass: './src/css/style-*.scss',
        css: './src/**/*.css',
        html: './src/**/*.html',
        htmlAll: './src/html/**/*',
        php: './src/**/*.php',
        svg: './src/svg/**/*.svg',
        jsCommon: './src/public/js/common/**/*.js'
    },
    tmp: {
        dir: './tmp',
        css: './tmp/css',
        img: './tmp/img',
        html: './tmp/html',
        sprite: './tmp/sprite',
        js: './tmp/js',
        svg: './tmp/svg',
        symboltemp: './tmp/symboltemp/',
        symbol: './tmp/symbolsvg'
    },
    dist: {
        dir: './dist',
        css: './dist/css',
        img: './dist/img',
        img: './dist/svg',
        html: './dist/pages',
        sprite: './dist/sprite'
    }
};


var postcssOption = [
    postcssAutoprefixer({
        browsers: ['last 8 versions']
    })
]

// 清除 dist 目录
function delDist() {
    return del([paths.dist.dir]);
}

// 清除 tmp 目录
function delTmp() {
    return del([paths.tmp.dir]);
}

function delSVG() {
    return del([paths.tmp.symboltemp]);
}


//css
function compileAutoprefixer() {
    return gulp.src(paths.src.css)
        .pipe(postcss(postcssOption))
        .pipe(minifyCSS({
            safe: true,
            reduceTransforms: false,
            advanced: false,
            compatibility: 'ie7',
            keepSpecialComments: 0
        }))
        .pipe(gulp.dest(paths.dist.dir))
        .pipe(rev())
        .pipe(rev.manifest())
        .pipe(gulp.dest('./tmp/css'));
}

//JS
function compileJs() {
    return gulp.src(paths.src.js)
        .pipe(uglify())
        .pipe(gulp.dest(paths.dist.dir))
        .pipe(rev())
        .pipe(rev.manifest())
        .pipe(gulp.dest('./tmp/js'));
}

function copyJs() {
    return gulp.src(paths.src.jsCommon)
        .pipe(gulp.dest('./dist/public/js/common/'))
}

//html
function compileHtml() {
    var manifest = gulp.src('./tmp/**/*.json');

    function modifyReved(filename) {
        // filename是：admin.69cef10fff.cache.css的一个文件名  
        // 在这里才发现刚才用gulp-rev-format的作用了吧？就是为了做正则匹配，
        var lastIndex = filename.lastIndexOf('-');
        var _filename = filename.substring(0, lastIndex);
        var _version = filename.substr(lastIndex + 1, 10);
        var _ext = filename.substr(lastIndex + 11)
        // if (filename.lastIndexOf('.') > -1) {
        //     // 通过正则和relace得到版本号：69cef10fff  
        //     const _version = filename.match(/\.[\w]*\.cache/)[0].replace(/(\.|cache)*/g, "");
        //     // 把版本号和gulp-rev-format生成的字符去掉，剩下的就是原文件名：admin.css  
        //     const _filename = filename.replace(/\.[\w]*\.cache/, "");
        //     // 重新定义文件名和版本号：admin.css?v=69cef10fff  
        //     filename = _filename + "?v=" + _version;
        //     // 返回由gulp-rev-replace替换文件名  
        //     return filename;
        // }

        return _filename + _ext + '?v=' + _version;
    }
    return gulp.src(paths.src.html)
        .pipe(revReplace({
            manifest: manifest,
            modifyReved: modifyReved
        }))
        .pipe(gulp.dest(paths.dist.dir));
}

//引入gulp和gulp插件
//   assetRev = require('gulp-asset-rev'),

//定义css、js源文件路径
// var cssSrc = 'css/*.css',
//   jsSrc = 'js/*.js';

//为css中引入的图片/字体等添加hash编码
// gulp.task('assetRev', function(){
//   return gulp.src(cssSrc)  //该任务针对的文件
//    .pipe(assetRev()) //该任务调用的模块
//    .pipe(gulp.dest('src/css')); //编译后的路径
// });

//CSS生成文件hash编码并生成 rev-manifest.json文件名对照映射
// gulp.task('revCss', function () {
//     return gulp.src(cssSrc)
//         .pipe(rev())
//         .pipe(rev.manifest())
//         .pipe(gulp.dest('rev/css'));
// });


// //js生成文件hash编码并生成 rev-manifest.json文件名对照映射
// gulp.task('revJs', function () {
//     return gulp.src(jsSrc)
//         .pipe(rev())
//         .pipe(rev.manifest())
//         .pipe(gulp.dest('rev/js'));
// });


// //Html替换css、js文件版本
// gulp.task('revHtml', function () {
//     return gulp.src(['rev/**/*.json', 'View/*.html'])
//         .pipe(revCollector())
//         .pipe(gulp.dest('View'));
// });


// //开发构建
// gulp.task('default', function (done) {
//     condition = false;
//     runSequence(    //需要说明的是，用gulp.run也可以实现以上所有任务的执行，只是gulp.run是最大限度的并行执行这些任务，而在添加版本号时需要串行执行（顺序执行）这些任务，故使用了runSequence.
//         ['assetRev'],
//         ['revCss'],
//         ['revJs'],
//         ['revHtml'],
//         done);
// });

// //CSS 压缩
// function miniCSS() {
//     return gulp.src('./tmp/css/style-*.css')
//         .pipe(minifyCSS({
//             safe: true,
//             reduceTransforms: false,
//             advanced: false,
//             compatibility: 'ie7',
//             keepSpecialComments: 0
//         }))
//         .pipe(gulp.dest('./tmp/css/'));
// }

// //图片压缩
// function imageminImg() {
//     return gulp.src(paths.src.img)
//         .pipe(imagemin({
//             use: [pngquant()]
//         }))
//         .pipe(gulp.dest(paths.tmp.img));
// }

// //复制媒体文件
// function copyMedia() {
//     return gulp.src(paths.src.media, { base: paths.src.dir }).pipe(gulp.dest(paths.tmp.dir));
// }

// //编译 JS
// function compileJs() {
//     var condition = webpackConfig ? true : false;

//     return gulp.src(paths.src.js)
//         .pipe(gulpif(
//             condition,
//             webpack(webpackConfig),
//             babel({
//                 presets: ['es2015', 'stage-2']
//             })
//         ))
//         .pipe(uglify())
//         .pipe(gulp.dest(paths.tmp.js));
// }

// //雪碧图压缩
// function imageminSprite() {
//     return gulp.src('./tmp/sprite/**/*')
//         .pipe(imagemin({
//             use: [pngquant()]
//         }))
//         .pipe(gulp.dest(paths.tmp.sprite));
// }

// //html 编译
// function compileHtml() {
//     return gulp.src(paths.src.html)
//         .pipe(ejs(ejshelper()))
//         .pipe(gulpif(
//             config.supportREM,
//             posthtml(
//                 posthtmlPx2rem({
//                     rootValue: 20,
//                     minPixelValue: 2
//                 })
//             ))
//         )
//         .pipe(parseSVG({ devPath: 'tmp', SVGGracefulDegradation: config.SVGGracefulDegradation }))
//         .pipe(gulp.dest(paths.tmp.html))
//         .pipe(usemin())
//         .pipe(gulp.dest(paths.tmp.html));
// }


// //webp 编译
// function supportWebp() {
//     if (config['supportWebp']) {
//         return webp();
//     } else {
//         return function noWebp(cb) {
//             cb();
//         }
//     }
// }

// //新文件名(md5)
// function reversion(cb) {
//     var revAll = new RevAll({
//         fileNameManifest: 'manifest.json',
//         dontRenameFile: ['.html', '.php'],
//         dontUpdateReference: ['.html'],
//         transformFilename: function (file, hash) {
//             var filename = path.basename(file.path);
//             var ext = path.extname(file.path);

//             if (/^\d+\..*\.js$/.test(filename)) {
//                 return filename;
//             } else {
//                 return path.basename(file.path, ext) + '.' + hash.substr(0, 8) + ext;
//             }

//         }
//     });

//     if (config['reversion']) {
//         return gulp.src(['./tmp/**/*'])
//             .pipe(revAll.revision())
//             .pipe(gulp.dest(paths.tmp.dir))
//             .pipe(revDel({
//                 exclude: /(.html|.htm)$/
//             }))
//             .pipe(revAll.manifestFile())
//             .pipe(gulp.dest(paths.tmp.dir));
//     } else {
//         cb();
//     }
// }
gulp.task('default', gulp.series(
    gulp.parallel(
        delDist,
        delTmp
    ),
    compileAutoprefixer,
    compileJs,
    copyJs,
    compileHtml
));